package TUILayer;
import java.util.Scanner;
import ControlLayer.*;

/**
 * Storage user interface:
 * Enables the user to create, find, delete, update and list all items.
 * 
 * @author (Gruppe 3)
 */
public class StorageUI
{
    // instance variables - replace the example below with your own
    private StorageCtr storageCtr;
    /**
     * Constructor for objects of class StorageUI
     */
    public StorageUI()
    {
        // initialise instance variables
       storageCtr = new StorageCtr();
    }
    
    /**
     * Opens the storage menu
     */
    public void open()
    {
        storageMenu();
    }
    
    /** 
     * Calls the print storage menu method and let the user pick a choice for the menu
     */
    private void storageMenu()
    {
        boolean close = false;
        while(!close)
        {
            int choice = makeStorageMenu();
            
            if(choice == 1)
            {
                //Creates a new Item
                createItem();
            }
            else
            {
                if(choice == 2)
                {
                    //Find a Item
                    findItem();
                }
                else
                {
                    if(choice == 3)
                    {
                        //Delete a Item
                        deleteItem();
                    }
                    else
                    {
                        if(choice == 4)
                        {
                            //Updates a Item
                            updateItem();
                        }
                        else
                        {
                          if(choice == 5)
                          {
                                //Show all Items
                                showAllItems();
                          }
                          else
                          {
                            if(choice == 6)
                            {
                                close = true;
                            }
                            
                            else
                            {
                                System.out.println("Indtast et nr mellem 1 og 6");
                                waitInput();
                            }
                          }
                        }
                    }
                }
            }
        }
    }
    
    /**
     * Prints storage menu
     */
    private int makeStorageMenu()
    {
        Scanner keyboard = new Scanner(System.in);
        System.out.println("\f ### Lager menu ### ");
        System.out.println(" (1) Opret vare");
        System.out.println(" (2) Find vare");
        System.out.println(" (3) Slet vare");
        System.out.println(" (4) Ret vare");
        System.out.println(" (5) Vis alle varer");
        System.out.println(" (6) Tilbage");
        System.out.println("\n Vælg et nummer ");
        
        int choice = keyboard.nextInt();
        
        return choice;
    }
    
    /**
     * System waits for an input, so the user can read the screen information
     */
    private void waitInput()
    {
        System.out.println("Tryk på en tast for at forsætte");
        new Scanner(System.in).nextLine();
    }
    
    /**
     * input of a string
     */
    private String inputString()
    {
        Scanner keyboard = new Scanner(System.in);
        String inputString = keyboard.nextLine();
        return inputString;
    }
    
     /**
     * checks if the input is an integer
     * 
     * @param checkInput  string to check if it is an integer
     */ 
    private boolean isDouble(String checkInput)
    {
        try
        {
            Double.parseDouble(checkInput);
        }
        catch(NumberFormatException e)
        {   
            System.out.println("Du skal skrive et decimaltal.");
            return false;
        }
        
        return true;        
    }    
    
    /**
     * inputs a variable of the type double
     */
    private double inputDouble()
    {
        Scanner keyboard = new Scanner(System.in);      
        boolean parsedInput = false;
        
        while(!parsedInput)
        {   
            String testInput = keyboard.nextLine();
            
            // checks if the input string is an integer
            if (isDouble(testInput))
            {   
                parsedInput = true;
                double newInput = Double.parseDouble(testInput);               
                return newInput;
            }
        }
           
        return 0;
    }
    
    /**
     * Create an item
     */
    private void createItem()
    {
        System.out.println("Indtast varens id");
        String itemCode = inputString();
        
        System.out.println("Indtast varens navn");
        String name = inputString();
        
        System.out.println("Indtast varens type");
        String type = inputString();
        
        System.out.println("Indtast varens pris");
        double price = inputDouble();
        
        // for future development
        //System.out.println("Indtast varens rabat");
        //double discount = inputDouble();
        double discount = 0;
        
        if (!itemCode.isEmpty() && !name.isEmpty() && !type.isEmpty() && price > 0)
        {   
            try
            {
                storageCtr.createItem(itemCode, name, type, price, discount);
            }
            catch(NullPointerException e )
            {
                System.out.println("Du har en eller flere værdier som ikke er gyldige for oprettelse af en kunde");
                waitInput();
            }
        }
        else
        {
            System.out.println("Du har en eller flere værdier som ikke er gyldige for oprettelse af en vare");
            waitInput();
        }
    }
    
    /**
     * Find an item
     */
    private void findItem()
    {
        System.out.println("Indtast id på varen");
        String searchItemCode = inputString();
        
        if (searchItemCode != null && !searchItemCode.isEmpty())
        {
            try
            {
                storageCtr.findItem(searchItemCode);
                storageCtr.listItem(searchItemCode);
                waitInput();
            }
            catch(NullPointerException e)
            {
                System.out.println("Varen med vare nummer: " + searchItemCode + " kunne ikke findes i systemet");
                waitInput();
            }
        }
        else
        {
            System.out.println("Du skal indtaste et ID for at kunne slette en vare");
            waitInput();
        }
    }
    
    /**
     * Delete an Item
     */
    private void deleteItem()
    {
        System.out.println("Indtast id på varen");
        String searchItemCode = inputString();
        
        if (searchItemCode != null && !searchItemCode.isEmpty())
        {
            try
            {
                storageCtr.deleteItem(searchItemCode);
                System.out.println("Varen med vare nummer: " + searchItemCode + " blev slettet i systemet");
                waitInput();
            }
            catch(NullPointerException e)
            {
                System.out.println("Varen med vare nummer: " + searchItemCode + " kunne ikke findes i systemet");
                waitInput();
            }
        }
        else
        {
            System.out.println("Du skal indtaste et ID for at kunne slette en ansat");
            waitInput();
        }
    }
    
    /**
     * Update an item
     */
    private void updateItem()
    {
        System.out.println("Indtast det nuværende id på varen");
        String oldItemCode = inputString();
        
        System.out.println("Indtast det nye id på varen");
        String itemCode = inputString();
        
        System.out.println("Indtast varens navn");
        String name = inputString();
        
        System.out.println("Indtast varens type");
        String type = inputString();
        
        System.out.print("Indtast varens pris");
        double price = inputDouble();
        
        // for later development
        //System.out.println("Indtast rabat på varen");
        //double discount = inputDouble();
        // sets item discount to zero for now
        double discount = 0.0;
        
        if (storageCtr.getItem(oldItemCode) != null && !oldItemCode.isEmpty())
        {
            try
            {
                storageCtr.updateItem(oldItemCode, itemCode, name, type, price, discount);
                System.out.println("Varen blev opdateret");
                waitInput();
            }
            catch(NullPointerException e)
            {
                System.out.println("Du har ikke indtaste alle værdierne, som skal bruges til at opdatere en vare i systemet");
                waitInput();
            }
        }
        else
        {
            System.out.println("Varen som skulle opdateres kunne ikke findes i systemet");
            waitInput();
        }
    }
    
    /**
     * Show all registered items
     */
    private void showAllItems()
    {   
        try
        {
            storageCtr.listAllItems();
            waitInput();
        }
        catch(NullPointerException e )
        {
            System.out.println("Der skete en fejl, da systemet prøvede at liste alle registered varer");
            waitInput();
        }
    }
}
